package com.vlong.town.service.role;

import java.util.Arrays;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.vlong.town.entity.role.Role;
import com.vlong.town.entity.roleMenuRef.RoleMenuRef;
import com.vlong.town.mapper.role.RoleMapper;
import com.vlong.town.mapper.roleMenuRef.RoleMenuRefMapper;

/**
 * 系统角色业务接口实现类
 * @author Assassin
 */
@Service
public class RoleService{

	// Fields

	@Autowired
	private RoleMapper roleMapper;// 系统角色DAO接口
	@Autowired
	private RoleMenuRefMapper  RoleMenuRefMapper;//

	// Methods

   /**
	* 添加系统角色
	* @param roleId 标识信息-角色Id[主键值]
	* @param roleCode 标识信息-角色编码
	* @param roleType 标识信息-角色类型
	* @param orgId 标识信息-机构Id
	* @param roleStatus 状态信息-角色数据状态
	* @param isDel 状态信息-是否删除[1-是 | 0-否]
	* @param roleOrder 状态信息-角色排序
	* @param roleName 基本信息-角色名称
	* @param roleDesc 基本信息-角色说明
	* @param createTime 时间信息-创建时间
	* @param updateTime 时间信息-更新时间[初始化=NULL]
	* @return Long roleId 添加后的数据库主键值
	*/
	@Transactional
	public Long add(Long roleId, String roleCode, Integer roleType, Long orgId, Integer roleStatus, Integer isDel, Integer roleOrder, String roleName, String roleDesc, Long createTime, Long updateTime,String menuIds) {
		// 构造系统角色参数实体
		Role wyTownRole = new Role();
		wyTownRole.setRoleId(roleId);// Set 标识信息-角色Id[主键值]
		wyTownRole.setRoleCode(roleCode);// Set 标识信息-角色编码
		wyTownRole.setRoleType(roleType);// Set 标识信息-角色类型
		wyTownRole.setOrgId(orgId);// Set 标识信息-机构Id
		wyTownRole.setRoleStatus(roleStatus);// Set 状态信息-角色数据状态
		wyTownRole.setIsDel(isDel);// Set 状态信息-是否删除[1-是 | 0-否]
		wyTownRole.setRoleOrder(roleOrder);// Set 状态信息-角色排序
		wyTownRole.setRoleName(roleName);// Set 基本信息-角色名称
		wyTownRole.setRoleDesc(roleDesc);// Set 基本信息-角色说明
		wyTownRole.setCreateTime(createTime);// Set 时间信息-创建时间
		wyTownRole.setUpdateTime(updateTime);// Set 时间信息-更新时间[初始化=NULL]
		// 调用系统角色DAO接口
		Long id = this.roleMapper.insert(wyTownRole);
		Long roleId2 = wyTownRole.getRoleId();
		// 角色添加成功、添加角色、菜单关联关系
		String[] menuIdsArr = menuIds.split(",");
		for(String menuId : menuIdsArr) {
			if(!menuId.equals("0")) {
				this.RoleMenuRefMapper.insert(new RoleMenuRef(null, orgId, roleId2, Long.parseLong(menuId)));
			}
		}
		return wyTownRole.getRoleId();
	}

   /**
	* 删除系统角色
	* @param roleId 主键值
	*/
	@Transactional
	public void delete(Long roleId) {
		// 调用系统角色DAO接口
		this.roleMapper.delete(roleId);
	}

   /**
	* 更新系统角色
	* @param roleId 标识信息-角色Id[主键值]
	* @param roleCode 标识信息-角色编码
	* @param roleType 标识信息-角色类型
	* @param orgId 标识信息-机构Id
	* @param roleStatus 状态信息-角色数据状态
	* @param isDel 状态信息-是否删除[1-是 | 0-否]
	* @param roleOrder 状态信息-角色排序
	* @param roleName 基本信息-角色名称
	* @param roleDesc 基本信息-角色说明
	* @param createTime 时间信息-创建时间
	* @param updateTime 时间信息-更新时间[初始化=NULL]
	*/
	@Transactional
	public void edit(Long roleId, String roleCode, Integer roleType, Long orgId, Integer roleStatus, Integer isDel, Integer roleOrder, String roleName, String roleDesc, Long createTime, Long updateTime,String menuIds) {
		// 构造系统角色参数实体
		Role wyTownRole = new Role();
		wyTownRole.setRoleId(roleId);// Set 标识信息-角色Id[主键值]
		wyTownRole.setRoleCode(roleCode);// Set 标识信息-角色编码
		wyTownRole.setRoleType(roleType);// Set 标识信息-角色类型
		wyTownRole.setOrgId(null);// Set 标识信息-机构Id
		wyTownRole.setRoleStatus(roleStatus);// Set 状态信息-角色数据状态
		wyTownRole.setIsDel(isDel);// Set 状态信息-是否删除[1-是 | 0-否]
		wyTownRole.setRoleOrder(roleOrder);// Set 状态信息-角色排序
		wyTownRole.setRoleName(roleName);// Set 基本信息-角色名称
		wyTownRole.setRoleDesc(roleDesc);// Set 基本信息-角色说明
		wyTownRole.setCreateTime(createTime);// Set 时间信息-创建时间
		wyTownRole.setUpdateTime(updateTime);// Set 时间信息-更新时间[初始化=NULL]
		// 调用系统角色DAO接口
		this.roleMapper.update(wyTownRole);
		
		// 角色编辑成功、编辑角色、菜单、权限关联关系
		
		// 检查菜单信息是否更新
		List<RoleMenuRef> menuRefList = this.RoleMenuRefMapper.queryListByRoleId(roleId);
		if(menuRefList == null || menuRefList.size() == 0) {
			String[] menuIdArr = menuIds.split(",");
			for(String menuId : menuIdArr) {
				if(!menuId.equals("0")) {
					this.RoleMenuRefMapper.insert(new RoleMenuRef(null, orgId, roleId, Long.parseLong(menuId)));
				}
			}
		} else {
			String currMenuIds = "";
			for(RoleMenuRef ref : menuRefList) {
				currMenuIds += ref.getMenuId().longValue() + ",";
			}
			String[] currMenuArr = currMenuIds.split(",");
			String[] menuIdArr = menuIds.split(",");
			if(!Arrays.equals(currMenuArr, menuIdArr)) {
				this.RoleMenuRefMapper.delete(roleId);
				for(String menuId : menuIdArr) {
					if(!menuId.equals("0")) {
						this.RoleMenuRefMapper.insert(new RoleMenuRef(null, orgId, roleId, Long.parseLong(menuId)));
					}
				}
			}
		}
	}

   /**
	* 主键查询系统角色
	* @param roleId 主键值
	* @return WyTownRole 实体
	*/
	@Transactional(readOnly = true)
	public Role queryById(Long roleId) {
		// 调用系统角色DAO接口
		return this.roleMapper.selectById(roleId);
	}

   /**
	* 根据条件查询系统角色列表
	* @param roleId 标识信息-角色Id[主键值]
	* @param roleCode 标识信息-角色编码
	* @param roleType 标识信息-角色类型
	* @param orgId 标识信息-机构Id
	* @param roleStatus 状态信息-角色数据状态
	* @param isDel 状态信息-是否删除[1-是 | 0-否]
	* @param roleOrder 状态信息-角色排序
	* @param roleName 基本信息-角色名称
	* @param roleDesc 基本信息-角色说明
	* @param createTime 时间信息-创建时间
	* @param updateTime 时间信息-更新时间[初始化=NULL]
	* @return List<WyTownRole> 实体List
	*/
	@Transactional(readOnly = true)
	public List<Role> queryList(Long roleId, String roleCode, Integer roleType, Long orgId, Integer roleStatus, Integer isDel, Integer roleOrder, String roleName, String roleDesc, Long createTime, Long updateTime) {
		// 构造系统角色参数实体
		Role wyTownRole = new Role();
		wyTownRole.setRoleId(roleId);// Set 标识信息-角色Id[主键值]
		wyTownRole.setRoleCode(roleCode);// Set 标识信息-角色编码
		wyTownRole.setRoleType(roleType);// Set 标识信息-角色类型
		wyTownRole.setOrgId(orgId);// Set 标识信息-机构Id
		wyTownRole.setRoleStatus(roleStatus);// Set 状态信息-角色数据状态
		wyTownRole.setIsDel(isDel);// Set 状态信息-是否删除[1-是 | 0-否]
		wyTownRole.setRoleOrder(roleOrder);// Set 状态信息-角色排序
		wyTownRole.setRoleName(roleName);// Set 基本信息-角色名称
		wyTownRole.setRoleDesc(roleDesc);// Set 基本信息-角色说明
		wyTownRole.setCreateTime(createTime);// Set 时间信息-创建时间
		wyTownRole.setUpdateTime(updateTime);// Set 时间信息-更新时间[初始化=NULL]
		// 调用系统角色DAO接口
		return this.roleMapper.selectList(wyTownRole);
	}
	
	@Transactional(readOnly = true)
	public List<Role> queryRoleByUserId(Long userId) {
		return roleMapper.queryRoleByUserId(userId);
	}


}